/*
 * Copyright (c) 2010-2011 NOO. All Rights Reserved.
 * [Id:DateTimeUtils.java  2011-10-26 下午10:33 poplar.yfyang ]
 */
package org.mumu.pawn.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * <p>
 * 日期格式抓换、工具类.
 * </p>
 *
 * @author poplar.yfyang
 * @version 1.0 2011-10-26 下午10:33
 * @since JDK 1.5
 */
public class DateTimeUtils {

    /**
     * 日期常用格式 包含年月日
     */
    private static final String DATE_DAY = "yyyy-MM-dd";

    /**
     * 日期常用格式 包含时分秒 年月日
     */
    private static final String DATE_DAY_SECOND = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期间隔符号
     */
    private static final String DATE_SPLIT = "-";

    /**
     * 私有构造器，反之外部实例化
     */
    private DateTimeUtils() {
    }


    /**
     * 取得系统时间
     *
     * @return 系统时间
     * @deprecated use {@link org.joda.time.DateTimeUtils#currentTimeMillis()}
     */
    public static Long nowTime() {
        Date currentTime = new Date();
        return currentTime.getTime();
    }

    /**
     * 将长整型时间转换为字符串格式。
     *
     * @param time 长整型时间
     * @return 字符串格式的时间，格式为yyyy-MM-dd
     */
    public static String time(Long time) {
        if (time == null) {
            return "";
        }
        Calendar calendar = getCalendar(time);
        int year = getYear(calendar);
        int month = getMonth(calendar);
        int day = getDay(calendar);
        StringBuilder timeBuffer = new StringBuilder("");
        timeBuffer.append(year).append(DATE_SPLIT).append(joinTime(month)).append(DATE_SPLIT).append(joinTime(day));
        int hour = getHour(calendar);
        if (hour != 0) {
            if (hour == 8) {
                return timeBuffer.toString();
            }
            int minute = getMinute(calendar);
            int second = getSecond(calendar);
            timeBuffer.append(" ").append(joinTime(hour)).append(":").append(joinTime(minute)).append(":").append(joinTime(second));
        }
        return timeBuffer.toString();
    }

    /**
     * 将长整形的显示时间转换为毫秒数，显示时间表示为：yyyyMMddHHmmss
     *
     * @param time 显示时间：比如 20100909123054
     * @return 毫秒
     */
    public static Long toTime(Long time) {
        if (time == null) {
            return null;
        }
        return toTime(String.valueOf(time));
    }


    /**
     * 将格式为："2010-09-20 12:32:55"的字符串转成毫秒
     *
     * @param time "2010-09-20 12:32:55"格式的字符串
     *             如果为null，返回的则是当前天
     * @return 天数
     */
    public static Long toTime(String time) {
        if (time == null) {
            return new Date().getTime();
        }
        int size = time.length();
        SimpleDateFormat sdf = createDateFormat(size);
        Date date = new Date();
        try {
            date = sdf.parse(time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        return c.getTimeInMillis();
    }


    /**
     * 创建格式化和解析日期的工具类，根据长度来分别创建
     *
     * @param size 日期字符串的长度
     * @return 对应的格式化和解析日期的工具类
     */
    private static SimpleDateFormat createDateFormat(int size) {
        SimpleDateFormat sdf = null;
        switch (size) {
            case 10:
                sdf = new SimpleDateFormat(DATE_DAY);
                break;
            case 19:
                sdf = new SimpleDateFormat(DATE_DAY_SECOND);
                break;
        }
        if (sdf == null) {
            throw new RuntimeException("日期格式不正确");
        }
        return sdf;
    }


    /**
     * 取得根据给定的长整型时间的日历类
     *
     * @param time 长整型时间
     * @return 日历类
     */
    private static Calendar getCalendar(Long time) {
        Date date = new Date(time);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 取得给定日历的时间的毫秒
     *
     * @param calendar 给定的日历，需要进行时间设置
     * @return 毫秒
     */
    private static int getMilliSecond(Calendar calendar) {
        return calendar.get(Calendar.MILLISECOND);
    }

    /**
     * 取得给定日历的时间的秒
     *
     * @param calendar 给定的日历，需要进行时间设置
     * @return 秒
     */
    private static int getSecond(Calendar calendar) {
        return calendar.get(Calendar.SECOND);
    }

    /**
     * 取得给定日历的时间的分
     *
     * @param calendar 给定的日历，需要进行时间设置
     * @return 分
     */
    private static int getMinute(Calendar calendar) {
        return calendar.get(Calendar.MINUTE);
    }

    /**
     * 取得给定日历的时间的小时
     *
     * @param calendar 给定的日历，需要进行时间设置
     * @return 小时
     */
    private static int getHour(Calendar calendar) {
        return calendar.get(Calendar.HOUR_OF_DAY);
    }

    /**
     * 取得给定日历的月份
     *
     * @param calendar 日历，需要设置时间
     * @return 月份，需要+1
     */
    private static int getMonth(Calendar calendar) {
        return calendar.get(Calendar.MONTH) + 1;
    }

    /**
     * 取得给定日历的年度
     *
     * @param calendar 日历，需要设置时间
     * @return 年度
     */
    private static int getYear(Calendar calendar) {
        return calendar.get(Calendar.YEAR);
    }

    /**
     * 取得给定日历的日
     *
     * @param calendar 日历，需要设置时间
     * @return 日
     */
    private static int getDay(Calendar calendar) {
        return calendar.get(Calendar.DAY_OF_MONTH);
    }

    /**
     * 对月份和日期判断长度是否为2，如果不是，+0返回。
     *
     * @param mday 月份或者日期
     * @return 长度高于2 返回本身，小于2，+0返回
     */
    private static String joinTime(Integer mday) {
        return String.format("%02d", mday);
    }


}
